#include <SDL/SDL.h>
#include <stdio.h>
#include <stdlib.h>

void inicio();
int menu();
int colisao();
void finalizar();

/*
 * iniciar todas as funcoes do SDL
 * controle (conf. e menu)
 * jogo (enquanto não perde)
 * pontuação
 * finaliza
 */

void inicio() // Inicializa todas as funcoes do SDL
{
    SDL_Surface* carteiros = NULL;
    SDL_Surface* tela = NULL;

    if(SDL_Init(SDL_INIT_EVERYTHING) != 0)// Inicia todos os subsistemas da SDL. Caso falhe, mostra o erro e encerra o programa;
    {
        printf("Erro: %s\n", SDL_GetError());
        exit(-1);
    }

    tela = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE); // Cria uma superfície na memória do sistema com 32 bits de cores;

    if(!tela) // Verifica se tela nao eh NULL;
    {
        printf("Erro ao carregar bitmap.\n");
        exit(-1);
    }

    carteiros = SDL_LoadBMP("inicio.bmp");

    SDL_BlitSurface(carteiros, NULL, tela, NULL);
    SDL_Flip(tela);
    SDL_Delay(2500); // A imagem permanece na tela por 3 segundos;

    SDL_FreeSurface(carteiros);
}

int menu()
{
    Uint8 *teclado;

    SDL_Surface* tela = NULL;
    SDL_Surface* meu_menu = NULL;
    SDL_Surface* estagio1 = NULL;
    SDL_Event event;

    tela = SDL_SetVideoMode(800, 600, 32, SDL_SWSURFACE);
    meu_menu = SDL_LoadBMP("menu.bmp");
    SDL_BlitSurface(meu_menu, NULL, tela, NULL);
    SDL_Flip(tela);

    SDL_FreeSurface(meu_menu);

    teclado = SDL_GetKeyState(0);
    SDL_WaitEvent(&event);

    if(teclado[SDLK_1])
    {

        estagio1 = SDL_LoadBMP("estagio1.bmp");
        SDL_BlitSurface(estagio1, NULL, tela, NULL);
        SDL_Flip(tela);

        SDL_Delay(2500);
        SDL_FreeSurface(estagio1);

        return 1;

    }
    if(teclado[SDLK_2])
    {
        meu_menu = SDL_LoadBMP("instrucoes.bmp");
        SDL_BlitSurface(meu_menu, NULL, tela, NULL);
        SDL_Flip(tela);

        teclado = SDL_GetKeyState(0);
        SDL_WaitEvent(&event);

        // continua esperando ate que uma tecla seja pressionada

		while (event.type != SDL_KEYDOWN)
		{
			SDL_WaitEvent(&event);
		}
    }
    if(teclado[SDLK_3])
    {
        meu_menu = SDL_LoadBMP("sobre.bmp");
        SDL_BlitSurface(meu_menu, NULL, tela, NULL);
        SDL_Flip(tela);

        teclado = SDL_GetKeyState(0);
        SDL_WaitEvent(&event);

        // continua esperando ate que uma tecla seja pressionada
		while (event.type != SDL_KEYDOWN)
		{
			SDL_WaitEvent(&event);
		}
    }
    if(teclado[SDLK_4])
    {
        return 0; // Encerra;
    }
    else
    {
        SDL_WaitEvent(&event);
        return menu();
    }
}

int colisao(SDL_Rect a,SDL_Rect b)
 {
     if((a.x+a.w < b.x) || (a.x > b.x+b.w) || (b.y+b.h < a.y) || (b.y > a.y+a.h))
     {
         return 1;
     }
     else
     {
         return 0;
     }
 }

int main(int argc, char* argv[])
{
    int i = 0, j = 0, k = 0, l = 0;
    int acrescimo_x1 = 3;
    const int acrescimo_x = 3, acrescimo_y = 3;
    const int dog_altura = 57, dog_largura = 29;
    const int tela_altura = 600, tela_largura = 800, color_bits = 32;
    const int inimigo_altura = 47, inimigo_largura = 55;
    Uint8* teclado;

    inicio();

    comeco:

    if (menu())
    {

        SDL_Surface* tela = NULL;
        SDL_Surface* personagem = NULL;
        SDL_Surface* personagem_otimizado = NULL;
        SDL_Surface* inimigo = NULL;
        SDL_Surface* inimigo_otimizado = NULL;
        SDL_Surface* cenario = NULL;
        SDL_Surface* menu_pause = NULL;
        SDL_Surface* fim = NULL;
        SDL_Rect fonte, destino;
        SDL_Rect fonte1, destino1;
        SDL_Event evento;

        tela = SDL_SetVideoMode(tela_largura, tela_altura, color_bits, SDL_SWSURFACE);

        if(!tela)
        {
            printf("Erro ao carregar imagem.\n");
            exit(-1);
        }

        cenario = SDL_LoadBMP("cenario.bmp");

        SDL_BlitSurface(cenario, NULL, tela, NULL);
        SDL_Flip(tela);

        personagem = SDL_LoadBMP("frente.bmp");
        personagem_otimizado = SDL_DisplayFormat(personagem);

        if(personagem_otimizado != NULL)
        {
            Uint32 color_key = SDL_MapRGB(personagem_otimizado->format, 255, 0, 0); /* mapeia o vermelho*/
            SDL_SetColorKey(personagem_otimizado, SDL_SRCCOLORKEY, color_key); /* tira o vermelho mapeado da imagem do personagem*/
        }

        fonte.x = 0;
        fonte.y = 0;
        fonte.w = dog_largura;
        fonte.h = dog_altura;

        destino.x =160;
        destino.y = 555;
        destino.w = dog_largura;
        destino.h = dog_altura;

        inimigo = SDL_LoadBMP("inimigo_dir.bmp");
        inimigo_otimizado = SDL_DisplayFormat(inimigo);

        if(inimigo_otimizado != NULL)
        {
            Uint32 color_key = SDL_MapRGB(inimigo_otimizado->format, 255, 0, 0); /* mapeia o vermelho*/
            SDL_SetColorKey(inimigo_otimizado, SDL_SRCCOLORKEY, color_key); /* tira o vermelho mapeado da imagem do personagem*/
        }

        fonte1.x = 0;
        fonte1.y = 0;
        fonte1.w = inimigo_largura;
        fonte1.h = inimigo_altura;

        destino1.x = 80;
        destino1.y = 255;
        destino1.w = inimigo_largura;
        destino1.h = inimigo_altura;

        SDL_FreeSurface(tela);

        do
        {
            SDL_BlitSurface(cenario, NULL, tela, NULL);

            SDL_PollEvent(&evento);

            switch(evento.type)
            {
                case SDL_KEYDOWN:

                    printf("Tecla pressionada.\n");
                    break;

                case SDL_KEYUP:

                    printf("Tecla solta.\n");
                    break;

                case SDL_QUIT:

                    printf("Saída requerida.\n");
            }

            SDL_PumpEvents();
            teclado = SDL_GetKeyState(0);

            if (teclado[SDLK_UP])
            {
                personagem = SDL_LoadBMP("costas.bmp");
                personagem_otimizado = SDL_DisplayFormat(personagem);

                destino.y -= acrescimo_y;

                if (j%3 == 0)
                {
                    i++;
                }
                j++;
            }
            if (teclado[SDLK_DOWN])
            {
                personagem = SDL_LoadBMP("frente.bmp");
                personagem_otimizado = SDL_DisplayFormat(personagem);

                destino.y += acrescimo_y;

                if (j%3 == 0)
                {
                    i++;
                }
                j++;
            }
            if (teclado[SDLK_RIGHT])
            {
                personagem = SDL_LoadBMP("direita.bmp");
                personagem_otimizado = SDL_DisplayFormat(personagem);

                destino.x += acrescimo_x;

                if (j%3 == 0)
                {
                    i++;
                }
            j++;
            }
            if (teclado[SDLK_LEFT])
            {
                personagem = SDL_LoadBMP("esquerda.bmp");
                personagem_otimizado = SDL_DisplayFormat(personagem);

                destino.x -= acrescimo_x;

                if (j%3 == 0)
                {
                    i++;
                }
                j++;
            }

            if(teclado[SDLK_ESCAPE]) // Pausar o jogo;
            {
                SDL_WaitEvent(&evento);
                SDL_WaitEvent(&evento);
            }


            if(colisao(destino,destino1)==0) //  Detecta a colisão entre personagem e inimigo;
            {
                printf("colisao\n");

                fim = SDL_LoadBMP("fim.bmp");
                SDL_BlitSurface(fim, NULL, tela, NULL);
                SDL_Flip(tela);

                SDL_Delay(3500);
                SDL_FreeSurface(fim);

                goto comeco;
            }


            if(personagem_otimizado != NULL)
            {
                Uint32 color_key = SDL_MapRGB(personagem_otimizado->format, 255, 0, 0); /* mapeia o vermelho*/
                SDL_SetColorKey(personagem_otimizado, SDL_SRCCOLORKEY, color_key); /* tira o vermelho mapeado da imagem do personagem*/
            }

            fonte.x = (i % 2) * dog_largura;

            if ((destino.y + dog_altura + acrescimo_y > tela_altura) || (destino.y + acrescimo_y < 0)) // Impede o personagem de atravessar a tela;
            {
                destino.y -= acrescimo_y;
            }
            if ((destino.x + dog_largura + acrescimo_x > tela_largura) || (destino.x + acrescimo_x < 0))
            {
                destino.x -= acrescimo_x;
            }

            SDL_BlitSurface(personagem_otimizado, &fonte, tela, &destino);


            if ((destino1.x + inimigo_largura + acrescimo_x1 > 800) || (destino1.x + acrescimo_x1 < 0)) // Impede o inimigo de atravessar a tela;
            {
                acrescimo_x1 = -acrescimo_x1;
            }

            destino1.x += acrescimo_x1;

            fonte1.x = (k%2) * inimigo_largura;

            if (acrescimo_x1 > 0)
            {
                inimigo = SDL_LoadBMP("inimigo_dir.bmp");
                inimigo_otimizado = SDL_DisplayFormat(inimigo);
            }
            else
            {
                inimigo = SDL_LoadBMP("inimigo_esq.bmp");
                inimigo_otimizado = SDL_DisplayFormat(inimigo);
            }

            if(inimigo_otimizado != NULL)
            {
                Uint32 color_key = SDL_MapRGB(inimigo_otimizado->format, 255, 0, 0); /* mapeia o vermelho*/
                SDL_SetColorKey(inimigo_otimizado, SDL_SRCCOLORKEY, color_key); /* tira o vermelho mapeado da imagem do personagem*/
            }

            SDL_BlitSurface(inimigo_otimizado, &fonte1, tela, &destino1);

            SDL_Flip(tela);

            if (l%5 == 0)
            {
                k++;
            }
            l++;

        }
        while(evento.type != SDL_QUIT);

        SDL_Quit();
    }

    return 0;
}
